package com.miyu.common.utils.commonUtils;


import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.miyu.common.utils.ehcache.EhcacheUtil;
import com.miyu.common.utils.magic.GetBeanUtil;
import com.miyu.common.utils.redis.redisUtils.RedisCache;
import com.miyu.common.utils.redis.redisUtils.util.RedisListUtil;
import com.miyu.common.utils.redis.redisUtils.util.RedisValUtil;
import com.miyu.common.utils.web.PropertiesUtil;

/**
 * 缓存类公共处理方法
 * 默认ehcache  redis优先
 * 参数说明
 * redis cacheName 表示 数据所在区域 如果非数字则默认区域
 * ehcache时对应缓存名称
 * 支持取值 存执 以key值处理
 * 存储类型为JSONObject JSONArray
 */
public class Comcache {

    static RedisListUtil rv = GetBeanUtil.getBeanByClass(RedisListUtil.class);
    static RedisValUtil rsv = GetBeanUtil.getBeanByClass(RedisValUtil.class);

    static RedisCache rdc = GetBeanUtil.getBeanByClass(RedisCache.class);

    /*是否启动redis*/
    static String isRedis= PropertiesUtil.getProperty("spring.redis.enable");

    /**
     * 获取数据 Object
     * @param key
     * @return
     */
    public static Object getBykey(String cacheName,String key){
        Object obj = null;
        if(isRedis.equals("true")){

            obj = rsv.get(key);
        }else{
             obj = EhcacheUtil.getInstance().get(cacheName, key);
            if (obj!=null) {
                return obj;
            }
        }
        return obj;
    }


    /**
     * 同一数据返回 JSONObject 包含{data:data}数据
     *
     * @param cacheName 缓存名称
     * @param key       关键
     * @return {@link JSONObject}
     */
    public static Object getComData(String cacheName,String key){
        Object obj = null;
        if(isRedis.equals("true")){
            obj = JSONObject.parseObject(rsv.get(key));
        }else{
            obj = EhcacheUtil.getInstance().getJSONObject(cacheName, key).get("data");
            if (obj!=null) {
                return obj;
            }
        }
        return obj;
    }


    /**
     * 得到jsonobject bykey
     *
     * @param cacheName 缓存名称
     * @param key       关键
     * @return {@link Object}
     */
    public static JSONObject getJSONObjectBykey(String cacheName,String key){
        JSONObject rs = new JSONObject();
        if(isRedis.equals("true")){
            String val = rsv.get(key);
            JSONObject ps = JSONObject.parseObject(val);
            rs = JSONObject.parseObject(rsv.get(key));

        }else{
          Object  obj = EhcacheUtil.getInstance().get(cacheName, key);
            if (obj!=null) {
                rs =  (JSONObject) JSONObject.parseObject(obj.toString());
            }
        }
        return rs;
    }

    /**
     * jsonarray得到bykey
     *
     * @param cacheName 缓存名称
     * @param key       关键
     * @return {@link Object}
     */
    public static JSONArray getJSONArrayBykey(String cacheName,String key){
        JSONArray rs = new JSONArray();
        if(isRedis.equals("true")){
            String val = rsv.get(key);
            JSONObject ps = JSONObject.parseObject(val);
            rs = JSONArray.parseArray(val);
        }else{
            Object  obj = EhcacheUtil.getInstance().get(cacheName, key);
            if (obj!=null) {
                rs = JSONArray.parseArray(String.valueOf(obj));
            }
        }
        return rs;
    }
    /**
     * set缓存数据
     * 以data :JSONArray 缓存数据
     * @param key
     */
    public static void setJSONObjectByKey(String cacheName,String key,JSONObject data ){
        /*redis*/
        if(isRedis.equals("true")){
            if(hasKey(cacheName,key)){
                JSONObject temp = getJSONObjectBykey(cacheName,key);
                temp.getJSONArray("data").add(data);
                rsv.set(key,temp);

            }else{
                JSONArray ja = new JSONArray();
                ja.add(data);
                rsv.set(key,ja);
            }
        }else{
            /*ehcache*/
            if(hasKey(cacheName,key)){
                JSONObject temp = getJSONObjectBykey(cacheName,key);
                temp.getJSONArray("data").add(data);
                /*当前页面写入缓存*/
                EhcacheUtil.getInstance().put(cacheName, key,temp);
            }else {
                JSONArray ja = new JSONArray();
                ja.add(data);
                EhcacheUtil.getInstance().put(cacheName,key,ja);
            }
        }

    }
    /**
     * set缓存数据
     * 以data :JSONArray 缓存数据
     * @param key
     */
    public static void setJSONObjectByKey(String cacheName,String key,JSONObject data,long expiry ){
        /*redis*/
        if(isRedis.equals("true")){
            if(hasKey(cacheName,key)){
                JSONObject temp = getJSONObjectBykey(cacheName,key);
                temp.getJSONArray("data").add(data);
                rsv.set(key,temp,expiry);

            }else{
                JSONArray ja = new JSONArray();
                ja.add(data);
                rsv.set(key,ja,expiry);
            }
        }else{
            /*ehcache*/
            if(hasKey(cacheName,key)){
                JSONObject temp = getJSONObjectBykey(cacheName,key);
                temp.getJSONArray("data").add(data);
                /*当前页面写入缓存*/
                EhcacheUtil.getInstance().put(cacheName, key,temp,expiry);
            }else {
                JSONArray ja = new JSONArray();
                ja.add(data);
                EhcacheUtil.getInstance().put(cacheName,key,ja,expiry);
            }
        }

    }



    /**
     * set缓存数据
     * expiry 过期时间
     * @param key
     */
    public static void setJSONArrayByKey(String cacheName,String key,JSONArray data ){
        if(isRedis.equals("true")){
            rdc.set(key,data,1800);
        }else{
            if(hasKey(cacheName,key)){
                JSONArray temp = getJSONArrayBykey(cacheName,key);
                temp.addAll(data);
                EhcacheUtil.getInstance().put(cacheName, key,  temp);
            }else {
                JSONArray ja = new JSONArray();
                ja.addAll(data);
                EhcacheUtil.getInstance().put(cacheName,key,ja);
            }
        }
    }
    /**
     * set缓存数据
     * expiry 过期时间
     * @param key
     */
    public static void setJSONArrayByKey(String cacheName,String key,JSONArray data,long expiry ){
        if(isRedis.equals("true")){
            if(hasKey(cacheName,key)){
                JSONArray temp = getJSONArrayBykey(cacheName,key);
                temp.addAll(data);
                rsv.set( key, JSONArray.of(temp),expiry);
            }else{
                JSONArray ja = new JSONArray();
                ja.addAll(data);
                rsv.set(key,JSONArray.of(ja),expiry);
            }
        }else{
            if(hasKey(cacheName,key)){
                JSONArray temp = getJSONArrayBykey(cacheName,key);
                temp.addAll(data);
                EhcacheUtil.getInstance().put(cacheName, key,  temp,expiry);
            }else {
                JSONArray ja = new JSONArray();
                ja.addAll(data);
                EhcacheUtil.getInstance().put(cacheName,key,ja,expiry);
            }
        }
    }
    /**
     * 移除缓存数据
     * @param key
     */
    public static void removeByKey(String cacheName,String key){
        if(isRedis.equals("true")){
            rsv.delete(key);
        }else{
            EhcacheUtil.getInstance().remove(cacheName,key);
        }
    }
    /**
     * 判断是否存在缓存数据
     * @param key
     * @return
     */
    public static boolean hasKey(String cacheName,String key){
        boolean rs = false;
        if(isRedis.equals("true")){
            rs = rsv.hasKey(key);
        }else{
            rs= EhcacheUtil.getInstance().hasKey(cacheName,key);
        }
        return  rs;
    }
}
